package BDD.gestionnaires; 

import javax.ejb.Stateless;

import java.util.Collection;  
import javax.ejb.Stateless;  
import javax.persistence.EntityManager;  
import javax.persistence.PersistenceContext;  
import javax.persistence.Query;  
import BDD.modeles.*;  

/**
 * @version 1.0.0
 * @author AZRIA Nouriel
 */
@Stateless
public class GestionnaireNotification {

    // Ici injection de code : on n'initialise pas. L'entity manager sera créé  
    // à partir du contenu de persistence.xml  
    @PersistenceContext  
    private EntityManager em;
    
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    
    /* LES METHODES */
    
    public Notification creeNotification(Utilisateur utilisateur, Commentaire commentaire) { 
                
        // Creer une notification
        Notification n = new Notification(utilisateur, commentaire);
        
        // Ajouter la notification à l'utilisateur
        utilisateur = em.merge(utilisateur);
        utilisateur = em.find(Utilisateur.class, utilisateur.getId());
        utilisateur.addNotifications(n);

        // Mettre a jour le commentaire
        commentaire = em.merge(commentaire);
        commentaire = em.find(Commentaire.class, commentaire.getId());
        commentaire.setNotification(n);
        
        // Persister la notification
        em.persist(n);  
        return n;  
    }
    
    /**
     * Methode permettant de recuperer une notification par son id
     * @param idNotif
     * @return la notification ou null
     */
    public Notification recupererNotification(int idNotif){ 

        // Initialiser le retour
        Notification n = null;
        
        // Essayer de recuperer
        String rq = "SELECT n FROM Notification n WHERE n.id=:idNotif";
        Query q = em.createQuery(rq);
        q.setParameter("idNotif", idNotif);
        q.setMaxResults(1);

        // Verifier s'il y a un resultat
        try{
            n = (Notification) q.getSingleResult();
        } 
        catch(javax.persistence.NoResultException e){}

        // Renvoyer le resultat
        return n;
    }
    
    /**
     * Methode permettant de supprimer une notification
     * @param n  
     */
    public void supprimerNotification(Notification n){
        
        // --- Reconnecter la notification --- //
        Notification notifConnecte = em.merge(n);
        notifConnecte = em.find(Notification.class, notifConnecte.getId());
        
        // --- Suppression de la notification --- //
        // -------------------------------------- //
        
        // Retirer la notification de l'utilisateur
        Utilisateur utilisateurConnecte = em.merge(notifConnecte.getUtilisateur());
        utilisateurConnecte = em.find(Utilisateur.class, utilisateurConnecte.getId());
        utilisateurConnecte.removeNotifications(notifConnecte);
        
        // Supprimer la photo de la base
        em.remove(notifConnecte);

    }
    
    public Collection<Notification> getFiveLastNotificationsOfUser(Utilisateur user) {  
        
        // Connecter l'utilisateur
        Utilisateur u = em.merge(user);
        u = em.find(Utilisateur.class, user.getId());
        
        // Renvoyer les notifications
        return u.getNotifications();  
    }
  
    public Collection<Notification> getAllNotifications() {  
        // Exécution d'une requête équivalente à un select *  
        Query q = em.createQuery("select n from Notification n");  
        return q.getResultList();  
    }  
    
}
